// 知识点1：由于构造函数在其进入函数体之前进行初始化（执行初始化列表），所以此时的try语句块还未生效，所以构造函数体内的catch语句无法处理构造函数初始值列表抛出的异常，这是就需要构造函数try语句块的形式，即将初始值列表置于try语句块中（try语句块出现在：冒号之后以及函数体的花括号之前）

// 所有的构造函数都添加这个try语句块即可

// template<typename T>
// Blob<T>::Blob() try:data(std::make_shared<std::vector<T>>()) {
// }
// catch (const std::bad_alloc &e) {
//     std::cerr << e.what() << std::endl;
// }
